# -*- coding: utf-8 -*-
# File : score_services.py
# Author: taoyahui
# Date : 2021/4/8

from student.models import *
from student.results import *
from student import utils

# 引入django的数据库连接connection
from django.db import connection
import json


# 通过学生学号查询学生所有成绩
def query_student_score(query_dict):
    # 判断request的body中是否包含stu_num字段
    if not utils.has_keys(query_dict, 'stu_num'):
        return info_error_result
    # 使用sql原生查询学生成绩信息
    # 使用sql join联表查询student_stu_info和student_score_info信息
    # 首先创建对应的游标
    cursor = connection.cursor()
    # 使用sql join语句查询
    cursor.execute(f"""
    select a.id, b.c_id, b.c_name, a.s_score 
    from student_score_info as a 
    left join student_course_info as b on a.c_id = b.c_id 
    where a.stu_num = {query_dict['stu_num']}""")  # sql语句：通过score表查询学生成绩，并查询对应课程名称
    rows = []
    # 将查询接口转存为数组Array
    for row in cursor.fetchall():
        r_dict = {
            'id': row[0],  # 学生学号
            'c_id': row[1],  # 课程编号
            'c_name': row[2],  #课程名称
            'score': row[3],    #成绩
        }
        rows.append(r_dict)
    # 以标准形式返回内容
    return_result = {
        'code': 200,
        'data': rows
    }
    return json.dumps(return_result)


# 绑定学生和课程（即学生选课）
def bind_student_course(bind_dict):
    # 判断学号和课程信息是否存在
    if not utils.has_keys(bind_dict, 'stu_num', 'c_id'):
        return info_error_result

    # 判断学号对应学生信息是否存在
    if not stu_info.objects.filter(stu_num=bind_dict['stu_num']).exists():
        return stu_not_exist_result
    # 判断课程是否存在
    if not course_info.objects.filter(c_id=bind_dict['c_id']).exists():
        return course_not_exist_result

    # 绑定学生信息，默认将成绩设为0分
    score = score_info(stu_num=bind_dict['stu_num'], c_id=bind_dict['c_id'], s_score=0)
    # 保存新建数据
    score.save()
    return success_result


# 解绑学生信息
def unbind_student_course(s_id):
    # 判断成绩是否存在
    if not s_id:
        return info_error_result
    # 删除学生选课内容
    score_info.objects.get(id=s_id).delete()
    return success_result


# 更新学生成绩
def update_student_score(score_dict):
    # 判断传入参数是否有成绩编号和成绩信息
    if not utils.has_keys(score_dict, 'id', 'score'):
        return info_incomplete_result
    # 找到成绩编号对应的内容
    u_score = score_info.objects.get(id=score_dict['id'])
    # 添加修改，保存
    u_score.s_score = score_dict['score']
    u_score.save()
    return success_result
